package com.nanbei.sort;

import java.util.Arrays;

/**
 * @ClassDescription: 希尔排序
 * @JdkVersion: 17
 * @Author: BaoShan.Li
 * @Date: 2024/6/25 22:51
 */
public class ShellSort {

    /**
     * - 简单的说，就是分组实现插入，每组元素间隙称为 gap
     * - 每轮排序后 gap 逐渐变小，直至 gap 为 1 完成排序
     * - 对插入排序的优化，让元素更快速地交换到最终位置
     * @param nums 待排序数组
     * @return 已排序数组
     */
    public static int[] shell(int[] nums){
        for (int gap = nums.length >> 1; gap >=1 ; gap = gap>>1) {
            for (int low = gap; low < nums.length ; low++) {
                //
                int temp = nums[low];
                int i = low-gap; // 已排序区域指针
                // 未找到插入位置，将较大的元素依次向后插入一位
                while ( i >= 0 && temp < nums[i]){
                    nums[i+gap] = nums[i];
                    i -= gap;
                }
                // 找到插入位置
                if (i != low-gap){
                    nums[i+gap] = temp;
                }
            }
        }

        return nums;
    }

    public static void main(String[] args) {
        int[] insertion = shell(new int[]{10,3,6,4,7,5,9,8,1,2});
        System.out.println(Arrays.toString(insertion));
    }
}
